/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Interfaz;

import Piezas.Cuadrado;
import Piezas.Matriz;
import Piezas.MatrizDatos;
import Piezas.Pieza;
import Timers.TimerActualizar;
import Timers.TimerPintado;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferStrategy;
import javax.swing.JOptionPane;
import javax.swing.Timer;

/**
 *
 * @author Jorge
 */
public class Display extends Canvas {

    private BufferStrategy bufer;
    private Graphics2D g2d;
    TimerPintado manPintar;
    Timer pintar;
    public Matriz matrizCuadrados;
    public MatrizDatos matrizDatosSig;
    public MatrizDatos matrizDatosHold;
    TimerActualizar manActualizar;
    Timer actualizar;
    public static Dimension dim;
    public static int lineasTotales = 0;
    public static int puntos = 0;
    public static boolean paused = false;
    public Pieza piezaActual;
    public Pieza piezaSiguiente;
    public Pieza piezaHold;
    public boolean holdDisponible = true;
    Font font;
    public boolean extremo = false;
    private ManejadorRaton manejadorRaton;

    public Display() {
        super();
        dim = new Dimension(301, 559);
        this.setPreferredSize(dim);
        this.setMaximumSize(dim);
        this.setMinimumSize(dim);
        //this.setMinimumSize(new Dimension(290, 600));
        matrizCuadrados = new Matriz(this);
        font = new Font("Verdana", Font.PLAIN, 20);
        piezaActual = new Pieza(-1, 0);
        piezaSiguiente = new Pieza(-1, 0);
        piezaHold = new Pieza(-1, 0);
        matrizDatosSig = new MatrizDatos(300, 290);
        matrizDatosHold = new MatrizDatos(300, 70);
        manejadorRaton = new ManejadorRaton();
    }

    @Override
    public void addNotify() {
        super.addNotify();
        this.createBufferStrategy(2);
        bufer = getBufferStrategy();
        this.requestFocus();
        manPintar = new TimerPintado(this);
        manActualizar = new TimerActualizar(this);
        this.addKeyListener(new manejadorTeclado());
        pintar = new Timer(10, manPintar);
        actualizar = new Timer(60, manActualizar);
        this.addMouseListener(manejadorRaton);
        this.addMouseMotionListener(manejadorRaton);
    }

    public void start() {
        matrizCuadrados.nuevaPieza(piezaActual,true);
        pintar.start();
        actualizar.start();
    }

    private void stop() {
        pintar.stop();
        actualizar.stop();
    }

    public void restart() {
        this.stop();
        lineasTotales = 0;
        puntos = 0;
        matrizCuadrados.reset();
        piezaActual.tipo = -1;
        matrizCuadrados.nuevaPieza(piezaActual,true);
        pintar.restart();
        actualizar.restart();
    }

    public void pause() {
        if (!Display.paused) {
            Display.paused = true;
        } else {
            Display.paused = false;
        }
    }

    public void render() {
        g2d = (Graphics2D) bufer.getDrawGraphics();
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, Frame.ANCHO, Display.dim.height); //Renderizar esto en el paint del canvas
        g2d.setColor(Color.BLACK);
        int aumX = 30, aumY = 31;
        for (int i = 0; i < 10; i++) {
            g2d.drawLine(aumX, 0, aumX, Display.dim.height);
            aumX += 30;
        }
        for (int i = 0; i < 17; i++) {
            g2d.drawLine(0, aumY, Display.dim.width - 2, aumY);
            aumY += 31;
        }
        g2d.setFont(font);
        g2d.drawString("LINEAS: " + Integer.toString(lineasTotales), 315, 535);
        g2d.drawString("PUNTOS: ", 315, 460);
        g2d.drawString(Integer.toString(puntos), 315, 490);
        g2d.drawString("Siguiente:", 315, 270);
        if (extremo) {

            g2d.drawString("Extremo!", 310, 230);
        }
        g2d.drawString("HOLD:", 315, 50);
        matrizDatosSig.renderMatrizDatos(g2d);
        matrizDatosHold.renderMatrizDatos(g2d);
        matrizCuadrados.renderMat(g2d);
    }

    public void draw() {
        if (!bufer.contentsLost()) {
            bufer.show();
        }
        if (g2d != null) {
            g2d.dispose();
        }
    }

    public class manejadorTeclado implements KeyListener {

        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                TimerActualizar.avanzar = true;
            }
            if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                //Comprobar collision
                if (!matrizCuadrados.colisionDerecha()) {
                    matrizCuadrados.desplazar(1);
                    //System.out.println("fila  " + matrizCuadrados.fActual + "  columna  " + matrizCuadrados.cActual);
                }
                if (matrizCuadrados.cMatActual < 6) {
                    matrizCuadrados.cMatActual++;
                }
            }
            if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                if (!matrizCuadrados.colisionIzquierda()) {
                    matrizCuadrados.desplazar(-1);
                    //System.out.println("fila  " + matrizCuadrados.fActual + "  columna  " + matrizCuadrados.cActual);
                }
                if (matrizCuadrados.cMatActual > 0) {
                    matrizCuadrados.cMatActual--;
                }
            }
            if (e.getKeyCode() == KeyEvent.VK_UP) {
                matrizCuadrados.rotarPieza();
            }
            if (e.getKeyCode() == KeyEvent.VK_P) {
                pause();
            }
            if (e.getKeyCode() == KeyEvent.VK_R) {
                restart();
            }
            if (e.getKeyCode() == KeyEvent.VK_E) {
                if (!extremo) {
                    extremo = true;
                } else {
                    extremo = false;
                }
            }
            if (e.getKeyCode() == KeyEvent.VK_SPACE) {
                if (piezaHold.tipo == -1) {
                    if (holdDisponible) {
                        piezaHold = piezaActual;
                        matrizDatosHold.setPieza(piezaActual);
                        matrizCuadrados.setTipo(0, matrizCuadrados.arrayPiezas);
                        matrizCuadrados.nuevaPieza(piezaSiguiente,true);
                    }
                } else {
                    holdDisponible = false;
                    piezaSiguiente = piezaActual;
                    piezaActual = piezaHold;
                    matrizCuadrados.setTipo(0,matrizCuadrados.arrayPiezas);
                    matrizCuadrados.nuevaPieza(piezaActual,false);
                    matrizDatosSig.setPieza(piezaSiguiente);
                    matrizDatosHold.limpiarMatriz();
                    piezaHold.resetPieza();
                }
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {
            TimerActualizar.avanzar = false;
        }
    }

    public class ManejadorRaton extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent evento) {
            if (!Display.paused) {
                pause();
            }
            JOptionPane.showMessageDialog(null, "'P' ----> PAUSE/CONTINUAR \n'R'"
                    + " ----> RESTART\n'E' ----> MODO EXTREMO!\n'ESPACIO' ---> HOLD", null, JOptionPane.INFORMATION_MESSAGE);
            pause();
        }
    }
}
